Pro ASP.NET Core MVC2(第7版)翻译

第1章:ASP .NET Core MVC 来龙去脉

作者:Adam Freeman 翻译:陈广 日期:2018-8-12


ASP.NET Core MVC是微软公司的一个web应用程序开发框架,它结合了model(模型)-view(视图)-controller(控制器)(MVC)体系结构的有效性和整洁性,敏捷开发的思想和技术,以及.NET平台的最佳部分。在本章中,您将了解 Microsoft 创建ASP.NET Core MVC的原因,了解它与其前身以及备选方案的比较,最后,概述ASP.NET Core MVC中的新内容以及本书所涵盖的内容。

了解 ASP.NET Core MVC 历史

最初的 ASP.NET 是在2002年引入的,当时微软热衷于保护传统桌面应用程序在开发中的主导地位,并将互联网视为一种威胁。图1-1显示了当时微软的技术栈。 图1-1 ASP.NET Web Forms技术栈

ASP.NET Web Forms

对于web Forms,微软试图通过将用户界面(UI)建模为服务器端控件对象的层次结构来隐藏超文本传输协议(HTTP)和超文本标记语言(HTML),这是当时许多开发人员所不熟悉的。每个控件都在请求中跟踪自己的状态,在需要时将自己渲染为HTML,并自动将客户端事件(如按钮单击)与相应的服务器端处理代码连接起来。实际上,web窗体是一个巨大的抽象层,旨在通过Web提供一个经典的事件驱动的图形用户界面(GUI)。

这样做的目的是让Web开发与开发桌面应用程序的感觉一样。开发人员可以从有状态UI的角度思考,而不需要使用一系列独立的 HTTP 请求和响应。微软可以无缝地将 Windows 桌面开发人员队伍转移到 Web 应用程序的新世界。

ASP.NET Web Forms 有什么问题?

传统的 ASP.NET Web Forms 开发原则上是好的,但事实证明更为复杂。

  • 视图状态权重:在请求之间维护状态(称为视图状态)的实际机制导致在客户端和服务器之间传输大量数据块。这种数据在即使是普通的 Web 应用程序中也可能达到数百KB,并且随着每一个请求来回移动,导致响应时间变慢,并增加了服务器的带宽需求。
  • 页面生命周期:将客户端事件与服务器端事件处理代码(页面生命周期的一部分)连接起来的机制可能复杂而微妙。很少有开发人员能在运行时成功地操作控件层次结构,而不出现视图状态错误或发现某些事件处理程序神秘地运行失败。
  • 错误的关注点分离感:ASP.NET Web Forms的代码隐藏(code-behind)模型提供了一种将应用程序代码从 HTML 标记中提取出来并放入单独的代码隐藏类的方法。这是为了分离逻辑和表现,但实际上,开发人员被鼓励将表现层代码(例如,操纵服务器端控件树)与其应用程序逻辑(例如,操纵数据库数据)混合在这些可怕的代码隐藏类中。最后的结果可能是脆弱和难以理解的。
  • 对HTML的有限控制:服务器控件将自己渲染为 HTML,但不一定是您喜欢的 HTML。在ASP.NET的早期版本中,HTML 输出未能满足Web标准或充分利用级联样式表(CSS),服务器控件生成难以使用 JavaScript 访问的不可预测和复杂的 ID 属性。这些问题在最近的 Web Forms 版本中得到了改进,但要获得预期的 HTML 仍然很棘手。
  • 抽象漏洞:Web Forms 试图在可能的情况下隐藏 HTML 和 HTTP。当您试图实现自定义行为时,经常需要从抽象中跳出来,这迫使您反向设计回发事件机制或执行钝操作以使其生成所需的 HTML。
  • 低可测试性:Web Forms 的设计者无法预料自动化测试将成为软件开发的重要组成部分。他们设计的紧密耦合的体系结构不适合单元测试。集成测试也可能是一个挑战。

Web窗体并不都是很糟糕,最终,微软致力于改进标准一致性和简化开发过程,甚至从最初的ASP.NET MVC框架中获得了一些特性,并将它们应用于 Web Forms。当您需要快速得出结果时,Web Forms会非常出色,您可以在一天内启动和运行一个相当复杂的 web 应用程序。但是,除非在开发过程中非常小心,否则您会发现您创建的应用程序很难测试和维护。

最初的 MVC 框架

2007年10月,微软宣布了一个基于现有 ASP.NET 的新的开发平台,旨在直接回应对 Web Forms 的批评和 Ruby on Rails 等竞争平台的流行。新平台被命名为 ASP.NET MVC 框架,它反映了web应用程序开发的新趋势,如 HTML 和 CSS 标准化、RESTful web服务、有效的单元测试,以及开发人员应该接受 HTTP 的无状态特性的想法。

支持原始 MVC 框架的概念现在看来是自然而明显的,但在2007年 .NET Web 开发领域却缺乏这些概念。ASP.NET MVC 框架的引入使微软的Web开发平台回到了现代

MVC 框架也标志着微软的态度发生了重大变化,微软此前曾试图控制 Web 应用工具链中的每个组件。在 MVC 框架下,微软在 jQuery 等开源工具的基础上,采纳了竞争平台(以及更成功的平台)的设计约定和最佳实践,并将源代码发布到 MVC 框架中,供开发人员检查。

原始的 MVC 框架有哪些问题?

在创建 MVC 框架之初,微软在现有的ASP.NET平台之上创建它是有道理的,该平台具有许多坚实的低级别功能,为开发过程提供了先机,并且已经为ASP.NET开发人员所熟知和理解。

但是,要将 MVC 框架移植到最初为 Web Forms 设计的平台上,就需要妥协。MVC 框架开发人员习惯于使用配置设置和代码调整,从而禁用或重新配置与其 Web 应用程序无关的特性,但又需要让一切正常运转。

随着 MVC 框架的普及,微软开始采用一些核心功能并将它们添加到 Web Forms 中。结果越来越奇怪,支持 MVC 框架所需的设计古怪的特性被扩展到支持 Web Forms 中,为使所有东西都能结合在一起出现了更多的设计怪癖。与此同时,微软开始用 web service(Web API)和实时通信(SignalR)等新框架来扩展 ASP.NET。新框架添加了各自的配置和开发约定,每个配置和开发约定都有自己的优点和奇怪之处,总体结果是支离破碎的混乱。

理解 ASP.NET Core

2015年,微软宣布了 ASP.NET 和 MVC 框架的新方向,它最终产生了 ASP.NET Core MVC,就是本书的主题。

ASP.NET Core 是建立在 .NET Core 之上的,它是一个跨平台版本的 .NET 框架,没有 Windows 特定的应用程序编程接口(API)。Windows仍然是一个主流的操作系统,但是 web 应用程序越来越多地托管在云平台中的小型和简单容器中,通过采用跨平台的方法,微软扩展了 .NET 的范围,使将ASP.NET Core应用程序部署到更广泛的宿主环境中成为可能。并作为奖励,使开发人员能够在 Linux 和 macOS 上创建 ASP.NET Coer web 应用程序。

ASP.NET Core 是一种全新框架。它更简单,更易于使用,并且不受 Web Forms 遗留的影响。而且因为基于.NET Core,使得它支持在一系列平台和容器上开发 Web 应用程序。

ASP.NET Core MVC 提供了在新的 ASP.NET 核心平台上构建的原始 ASP.NET MVC 框架的功能,它集成了以前由 Web API 提供的功能,它包括一种更自然的生成复杂内容的方法,它使关键的开发任务(如单元测试)变得更为简单、更可预测。

ASP.NET Core MVC 2 新特性

ASP.NET Core MVC 2 版本侧重于通过对早期版本中引入的一些工具和平台的整合及更改进行工作。ASP.NET Core MVC 2 需要.NET Core 2,它拥有一个扩展庞大的 API 接口,在其他 Linux 发行版上得到了支持。有益的更改包括一个新的元包系统,它简化了 NuGet 包的管理,为ASP.NET Core提供了一个新的配置系统,并支持Entity Framework Core 2。最大的新特性 Razor Pages,它试图使用更现代的平台重新创建与网页相关的开发风格,但 MVC 开发人员对 Razor Pages 不感兴趣(我在本书中没有对它进行描述)。

ASP.NET Core MVC 的主要优点

下面几节简要描述了新的 MVC 平台如何克服了Web Forms和原始 MVC 框架的遗留问题,以及它是如何将ASP.NET带回前沿的。

MVC 架构

ASP.NET Core MVC 遵循一种称为模型-视图-控制器的模式,它引导ASP.NET Web应用程序的形态及其包含的组件之间的交互。

区分 MVC 体系结构模式和 ASP.NET Core MVC 实现是很重要的。MVC 模式并不是新的-它可以追溯到1978年,Xerox PARC 上的 Smalltalk 项目,但它作为 Web 应用程序的一种模式在今天已经流行起来,原因如下:

  • 用户与使用 MVC 模式的应用程序的交互遵循一个自然循环:用户采取行动,响应时,应用程序更改其数据模型并将更新的视图传递给用户。然后循环重复。这对于作为一系列 HTTP 请求和响应交付的 Web 应用程序来说是非常方便的。
  • Web 应用程序需要结合几种技术(例如数据库、HTML 和可执行代码),通常分为一组等级或层。这些组合产生的模式自然映射到 MVC 模式中的概念上。

ASP.NET Core MVC 实现了 MVC 模式,与 Web Forms 相比,它提供了更好的关注点分离。实际上,ASP.NET Core MVC实现了MVC模式的一个变体,特别适合于Web应用程序。您将在第 3 章中了解更多关于此体系结构的理论和实践。

可扩展性

ASP.NET Core 和 ASP.NET Core MVC 是作为一系列具有定义良好的特性、满足 .NET 接口或构建在抽象基类之上的独立组件构建的。您可以轻松地用自己实现的组件替换关键组件。一般来说,ASP.NET Core MVC为每个组件提供以下三种选项:

  • 按原样使用组件的默认实现(对于大多数应用程序来说应该足够了)。
  • 依据默认实现派生子类以调整其行为。
  • 通过重新实现的接口或抽象基类完全替换组件。

从第14章开始,您将了解所有各类相关组件,以及如何和为什么要调整或替换每个组件。

严格控制 HTML 和 HTTP

ASP.NET Core MVC生成干净、符合标准的标记。它的内置标签助手生成符合标准的输出,但与 Web Forms 相比,有一个更重要的哲学变化。ASP.NET Core MVC鼓励您使用 CSS 设计简单、优雅的标记,而不是生成一些您几乎无法控制的 HTML 片段。

当然,如果您确实想为复杂的UI元素(如日期选择器或级联菜单)添加一些现成的小部件,ASP.NET Core MVC 采用的“无特殊需求”方法可以方便地使用最好的客户端库,如jQuery、Angular、React或Bootstrap CSS库。ASP.NET Core MVC与这些库可以很好地结合在一起,微软使用了一些与它们相关的模板以快速启动新的开发项目。

ASP.NET Core MVC 与 HTTP 协同工作。您可以控制浏览器和服务器之间传递的请求,因此您可以根据自己的喜好微调用户体验。使用 Ajax 非常简单,创建 Web services 来接收浏览器 HTTP 请求是一个简单的过程,如第20章所述。

可测试性

ASP.NET Core MVC 架构为您提供了一个很好的起点,使您的应用程序易于维护和可测试,因为您自然地将不同的应用程序关注点分成独立的部分。此外,ASP.NET Core平台和ASP.NET Core MVC框架的每一部分都可以被隔离并替换为单元测试,这样就可以使用任何流行的开源测试框架来执行,如我在第7章中介绍的xUnit。

在这本书中,您将看到如何为 ASP.NET MVC 的 Controller 和 Action 编写干净、简单的单元测试,以及使用各种测试和模拟策略为框架组件提供假的或模拟的实现来模拟任何场景的操作。即使您以前从未编写过单元测试,也会有一个很好的开始。

可测试性不仅仅是单元测试的问题。ASP.NET Core MVC应用程序也可以使用 UI 自动化测试工具很好地工作。您可以编写模拟用户交互的测试脚本,而无需猜测框架将生成哪些 HTML 元素结构、CSS类或ID,您也不必担心结构会意外地发生变化。

强大的路由系统

随着Web应用技术的改进,统一资源定位符(URL)的风格也发生了变化。像这样的URL:

/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742

越来越罕见,取而代之的是一种更简单、更干净的格式,如以下所示:

/to-rent/chicago/2303-silver-street

关注 URL 的结构有一些很好的理由。首先,搜索引擎重视在 URL 中找到的关键字。搜索 “rent in Chicago” 更有可能出现是那些 URL 更为简单的网址。其次,许多网络用户现在已经足够了解 URL,并通过在浏览器地址栏中键入它来欣赏导航的选择。第三,当某人理解 URL 的结构时,他们更有可能链接到它,与朋友共享它,甚至在电话上大声阅读它。第四,它不向公共互联网公开应用程序的技术细节、文件夹和文件名结构,因此您可以自由地更改底层实现而无需破坏传入的所有链接。

在早期的框架中很难实现干净的 URL,但是 ASP.NET Core MVC 使用一个称为 URL 路由的特性,通过默认方式提供干净的 URL。这使您可以控制 URL schema 及其与应用程序的关系,使您可以自由地创建对用户有意义和有用的 URL 模式,而不需要遵循预先定义的模式。这意味着如果愿意的话,您可以很容易地定义一个现代的 REST 风格的 URL schema。您将在第15章和第16章中找到关于 URL 路由的详细描述。

现代 API

微软的 .NET 平台随着每一个主要版本的演变,它支持甚至定义了现代编程中最先进技术。ASP.NET Core MVC是为 .NET Core 构建的,因此它的 API 可以充分利用 C# 程序员所熟悉的语言和运行时的新概念,包括 await 关键字,扩展方法,lambda 表达式,匿名和动态类型,以及Language Integrated Query (语言集成查询:LINQ)。

许多 ASP.NET Core MVC API 方法和编码模式比早期平台更为简洁、更有表现力。无需担心你没有跟上最新的 C# 语言特性,我在第4章提供了对于 MVC 开发来说最重要的 C# 特性的概要。

跨平台

之前的 ASP.NET 版本只适用于 Windows,需要使用 Windows 桌面来编写 web 应用程序,并要求 Windows 服务器部署和运行它们。微软让 ASP.NET Core 可以跨平台进行开发和部署。.NET Core 可用于不同平台,包括 macOS 和一系列流行的Linux发行版。跨平台支持使得部署 ASP.NET Core MVC 应用程序变得更为简单,并且对使用应用程序容器平台(如 Docker)提供了良好的支持。

大多数 ASP.NET Core MVC 的开发很可能在不久的将来都会使用 Visual Studio 来进行,但微软还创建了一个跨平台开发工具:Visual Studio Code,这意味着ASP.NET Coer MVC开发不再局限于Windows。

ASP.NET Core MVC 是开源的

与之前的微软 web 开发平台不同,您可以免费下载 ASP.NET Core 和 ASP.NET Core MVC 的源代码,甚至可以修改和编译自己的版本。当您的调试跟踪引导到一个系统组件并希望深入到它的代码中(甚至阅读原始程序员的注释)时,这是无价的。如果您正在构建高级组件,并且希望了解存在哪些开发可能性或内置组件是如何工作的,则它也非常有用。

您可以从 https://github.com/aspnet下载 ASP.NET Core 和 ASP.NET Core MVC 源代码。

我需要知道什么?

要想从这本书中得到最大的收获,您应该熟悉 web 开发的基本知识,了解 HTML 和 CSS 是如何工作的,并对 C# 有一定的了解。如果您对客户端的细节如 JavaScript 有些模糊,请不必担心。本书重点是服务器端开发,您可以通过里面的示例获取所需的内容。在第4章,我概述了 MVC 开发中最有用的 C# 语言特性,如果您要从早期版本转移到最新的 .NET 版本,会发现它非常有用。

本书的架构是什么?

本书分为两部分,每一部分都涉及一组相关的主题。

第一部分:介绍 ASP.NET Core MVC

这本书从 ASP.NET Core MVC 来龙去脉开始。我解释了 MVC 模式的好处和实际影响,介绍了 ASP.NET Core MVC 如何适应现代 Web 开发,并描述了每个 ASP.NET Core MVC 开发者所需的工具和 C# 语言特性。

在第二章,您将直接创建一个简单的 web 应用程序,并了解主要组件和构建块是什么,以及它们是如何组合在一起的。然而,这本书大部分时都介绍了一个名为 “SportStore” 的项目开发,通过这个项目,我将向您展示从开始一直到部署的现实开发过程,涉及了 ASP.NET Core MVC 的主要特性。

第二部分:ASP.NET Core MVC 详述

在第2部分中,我解释了在构建 SportsStore 应用程序时需要使用到的 ASP.NET Core MVC 某些特性的内部工作原理。我向您展示了每个特性是如何工作的,解释了它所起的作用,并向您展示了可用的配置和自定义选项。在第1部分中设定了大背景之后,我们将深入研究第2部分中的详细内容。

从何处获取示例代码?

您可以从https://github.com/apress/pro-asp.net-core-mvc-2下载本书所有章节的示例代码。下载是免费的,并包括重新创建示例所需的所有支持资源,从而不必键入它们。您不必下载代码,但这是使用示例进行实验的最简单方法,并且可以轻松地将代码复制和粘贴到自己的项目中。

在哪里能得到这本书的更正?

您可以在本书的 GitHub 仓库中的 Errata 文件中找到这本书的勘误表。 (https://github.com/apress/pro-asp.net-core-mvc-2

联系作者

如果您使用各章示例时出现问题,或在书中发现了问题,那么你可以通过 adam@adam-freeman.com 给我发电子邮件,我会尽力帮忙。请在 https://github.com/apress/pro-asp.net-core-mvc-2 查看这本书的勘误表,在联系我之前看看它是否包含了解决您的问题的方法。

总结

在本章中,我解释了ASP.NET Core MVC存在的背景,以及它是如何从 Web Forms 和最初的ASP.NET MVC 框架中演化而来的。我描述了使用 ASP.NET Core MVC 的优势和本书的架构。在下一章中,您将看到 ASP.NET Core MVC 的运行,并简单地演示了提供这些优势的特性。

;

© 2018 - IOT小分队文章发布系统 v0.3